package cn.agiledata.bank.myspace.service;

import java.io.InputStream;

import cn.agiledata.bank.common.util.Constant;
import cn.agiledata.bank.hibernateBean.Account;
import cn.agiledata.bank.hibernateBean.AuditOperandType;

public interface AuthenticateService {

    /**
     * 审核对象类名，用于审核模块找出相关的审核对象类型
     */
    public static final String AUDIT_OPERAND_CLASS = "Account";
    
    /**
    * 审核对象类名，用于审核模块找出相关的审核对象类型-企业结算账户认证
    */
    public static final String AUDIT_CLEARAMOUNT_CLASS="ClearAmount";

    /**
     * 身份证认证的操作类型标志，用户审核模块找出相关的审核对象类型
     */
    public static final String ACTION_FLAG_IDCARD_AUTHENTICATION = Constant.AUTHENTICATION_METHOD_IDCARD;
    
    /**
     * 企业结算账户的操作类型标志，用户审核模块找出相关的审核对象类型
     */
    
    public static final String ACTION_FLAG_CLEARAMOUNT_AUTHENTICATION=Constant.AUTHENTICATION_METHOD_CLEARAMOUNT;
    
    /**
     * 提交身份证认证请求
     * 正面和背面图片均不空时为上传二代证图片；
     * 正面图片为空时为上传一代证图片；
     * 正面和背面图片均为空时为传真身份证复印件。
     * 
     * @param account
     *            主账户
     * @param idcardName
     *            真实姓名
     * @param idcardNo
     *            身份证号码
     * @param authenticationMethod
     *            身份证提交方式
     * @param idcardPhotoStream
     *         身份证正面图片输入流
     * @param idcardPhotoBackStream
     *            身份证背面图片输入流
     * @return true if 成功提交身份证认证请求, otherwise false
     * @throws Exception
     */
    public boolean submitIdcard(Account account, String idcardName,
    		String idcardNo, String authenticationMethod,
    		InputStream idcardPhotoStream,InputStream idcardPhotoBackStream) throws Exception;

    /**
     * 判断用户是否达到进行银行卡认证的条件
     * 
     * @param account
     *            主账户
     * @return true if 用户达到进行银行卡认证的条件, otherwise false
     */
    public boolean feasibleBankCardAuthentication(Account account);

    /**
     * 获取指定账户的银行卡认证状态
     * 
     * @param account
     *            主账户
     * @return 指定账户的银行卡认证状态
     */
    public String getBankCardAuthenticationStatus(Account account);

    /**
     * 设置指定账户的银行卡认证状态
     * 
     * @param account
     *            主账户
     * @param status
     *            银行卡认证状态，取值见Constant
     * @return 更新过银行卡认证状态的主账户对象
     * @see Constant
     */
    public Account setBankCardAuthenticationStatus(Account account,
            String status);

    /**
     * 获取指定账户的手机认证状态
     * 
     * @param account
     *            主账户
     * @return 指定账户的手机认证状态
     */
    public String getMobileTelAuthenticationStatus(Account account);

    /**
     * 设置指定账户的手机认证状态
     * 
     * @param account
     *            主账户
     * @param status
     *            手机认证状态，取值见Constant
     * @return 更新过手机认证状态的主账户对象
     * @see Constant
     */
    public Account setMobileTelAuthenticationStatus(Account account,
            String status);

    /**
     * 获取指定账户的身份证认证状态
     * 
     * @param account
     *            主账户
     * @return 指定账户的身份证认证状态
     */
    public String getIdcardAuthenticationStatus(Account account);

    /**
     * 设置指定账户的身份证认证状态
     * 
     * @param account
     *            主账户
     * @param status
     *            身份证认证状态，取值见Constant
     * @return 更新过身份证认证状态的主账户对象
     * @see Constant
     */
    public Account setIdcardAuthenticationStatus(Account account, String status);

    /**
     * 
     * @return 身份证认证审核对象类型
     */
    public AuditOperandType getAuditOperandType();

    /**
     * 判断指定身份证号码是否可以进行指定账户的身份证认证
     * 
     * @param account
     *            主账户
     * @param idcardNo
     *            身份证号码
     * 
     * @return true if 指定身份证号码可以进行指定账户的身份证认证, otherwise false
     */
    public boolean authenticatableIdcardNo(Account account, String idcardNo);

    /**
     * 判断指定账户是否已通过身份证认证
     * 
     * @param account
     *            账户
     * @return true if 指定账户已通过身份证认证, otherwise false
     */
    public boolean passIdcardNoAuthentication(Account account);
    
    public boolean submitClearAmount(Account account,
			String authenticationMethod) throws Exception ;

}